#include <iostream>
#include <string>

// C++20模块功能展示
// 注意：实际使用需要编译器支持和特定的构建设置

// 以下是典型的C++20模块文件内容示例

/*
// 数学模块接口文件示例 (math.ixx)
export module math;  // 声明一个名为math的模块

// 导出函数
export int add(int a, int b) {
    return a + b;
}

export double multiply(double a, double b) {
    return a * b;
}

// 导出类
export class Calculator {
public:
    int add(int a, int b) { return a + b; }
    int subtract(int a, int b) { return a - b; }
    int multiply(int a, int b) { return a * b; }
    double divide(double a, double b) { return a / b; }
};

// 非导出函数（模块内部使用）
int square(int x) {
    return x * x;
}

// 导出命名空间
export namespace geometry {
    const double PI = 3.14159265358979;
    
    double circle_area(double radius) {
        return PI * radius * radius;
    }
    
    double rectangle_area(double width, double height) {
        return width * height;
    }
}
*/

/*
// 字符串工具模块接口文件示例 (string_utils.ixx)
export module string_utils;

import <string>;  // 导入标准库模块

export namespace string_utils {
    std::string to_upper(const std::string& s) {
        std::string result = s;
        for (char& c : result) {
            c = std::toupper(c);
        }
        return result;
    }
    
    std::string to_lower(const std::string& s) {
        std::string result = s;
        for (char& c : result) {
            c = std::tolower(c);
        }
        return result;
    }
}
*/

/*
// 使用模块的示例 (main.cpp)
import <iostream>;  // 导入标准库
import math;        // 导入自定义模块
import string_utils;

int main() {
    // 使用math模块中的函数
    std::cout << "2 + 3 = " << add(2, 3) << '\n';
    std::cout << "4.5 * 2.5 = " << multiply(4.5, 2.5) << '\n';
    
    // 使用math模块中的类
    Calculator calc;
    std::cout << "5 - 2 = " << calc.subtract(5, 2) << '\n';
    
    // 使用math模块中的命名空间
    double radius = 5.0;
    std::cout << "Circle area with radius " << radius 
              << " = " << geometry::circle_area(radius) << '\n';
    
    // 使用string_utils模块
    std::string text = "Hello, C++20 Modules!";
    std::cout << "Upper: " << string_utils::to_upper(text) << '\n';
    std::cout << "Lower: " << string_utils::to_lower(text) << '\n';
    
    return 0;
}
*/

// 模块分区示例
/*
// geometry.ixx
export module math:geometry;  // 声明一个分区

export namespace geometry {
    constexpr double PI = 3.14159265358979;
    
    export double circle_area(double radius) {
        return PI * radius * radius;
    }
    
    export double rectangle_area(double width, double height) {
        return width * height;
    }
}
*/

/*
// math.ixx (主模块接口)
export module math;

export import :geometry;  // 导出几何分区

export int add(int a, int b) {
    return a + b;
}

export double multiply(double a, double b) {
    return a * b;
}
*/

void demonstrate_modules() {
    std::cout << "  C++20 模块(Modules)演示:\n\n";
    
    // 1. 模块基本概念
    std::cout << "  模块的主要优势:\n";
    std::cout << "  - 改善编译时间（不像头文件那样需要重复解析）\n";
    std::cout << "  - 更好的封装（可以明确选择导出的内容）\n";
    std::cout << "  - 避免头文件常见的问题（如宏泄漏）\n";
    std::cout << "  - 更清晰的依赖关系\n\n";
    
    // 2. 模块语法示例
    std::cout << "  基本模块语法:\n";
    std::cout << "  - 定义模块:  export module my_module;\n";
    std::cout << "  - 导出函数:  export void my_function() { ... }\n";
    std::cout << "  - 导入模块:  import my_module;\n";
    std::cout << "  - 导入标准库: import <iostream>;\n\n";
    
    // 3. 模块分区
    std::cout << "  模块分区语法:\n";
    std::cout << "  - 声明分区:  export module my_module:partition;\n";
    std::cout << "  - 导出分区:  export import :partition;\n\n";
    
    // 4. 模块与头文件的对比
    std::cout << "  模块vs头文件:\n";
    std::cout << "  头文件方式:\n";
    std::cout << "  #include <iostream>   // 整个头文件内容被复制\n";
    std::cout << "  #include \"mylib.h\"    // 容易有宏冲突\n\n";
    
    std::cout << "  模块方式:\n";
    std::cout << "  import <iostream>;    // 只导入声明的符号\n";
    std::cout << "  import mylib;         // 更好的封装，没有宏泄漏\n\n";
    
    // 5. 实际使用示例
    std::cout << "  实际使用示例:\n";
    std::cout << "  import math;            // 导入自定义模块\n";
    std::cout << "  int result = add(2, 3); // 使用模块中的函数\n";
    std::cout << "  Calculator calc;        // 使用模块中的类\n";
    std::cout << "  double area = geometry::circle_area(5.0); // 使用模块中的命名空间\n";
} 